// #include <iostream>
// #include <string>
// #include <limits>
// #include <memory>
// #include "User.h"
// #include "Product.h"

// // 声明一个辅助函数来清空输入缓冲区
// void clearCin()
// {
//     std::cin.clear();                                                   // 清除任何错误标志
//     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 忽略缓冲区中剩余的字符
// }

// int main()
// {
//     UserController userCtrl;       // 用户控制器实例
//     ProductController productCtrl; // 商品控制器实例
//     User *currentUser = nullptr;   // 指向当前登录用户的指针

//     bool running = true;
//     while (running)
//     {
//         if (currentUser)
//         { // 如果有用户登录
//             // 调用当前用户的菜单，用户的showMenu方法将处理其特定的交互循环
//             // 当showMenu返回时，意味着用户选择退出登录
//             currentUser->showMenu(productCtrl, userCtrl); // 传递两个控制器
//             delete currentUser;                           // 清理已登录用户对象
//             currentUser = nullptr;
//             std::cout << "您已成功退出登录。\n";
//         }
//         else
//         { // 没有用户登录，显示主菜单
//             std::cout << "\n欢迎来到简易电商平台!\n";
//             std::cout << "=========================\n";
//             std::cout << "1. 用户登录\n";
//             std::cout << "2. 用户注册\n";
//             std::cout << "3. 浏览平台商品 (游客)\n";
//             std::cout << "0. 退出平台\n";
//             std::cout << "=========================\n";
//             std::cout << "请输入您的选择: ";

//             int choice;
//             if (!(std::cin >> choice))
//             {
//                 std::cout << "无效输入，请输入一个数字选项。\n";
//                 clearCin();
//                 continue;
//             }
//             clearCin(); // 清除输入数字后的换行符

//             switch (choice)
//             {
//             case 1:
//             { // 用户登录
//                 std::string username, password;
//                 std::cout << "--- 用户登录 ---\n";
//                 std::cout << "请输入用户名: ";
//                 std::getline(std::cin, username);
//                 std::cout << "请输入密码: ";
//                 std::getline(std::cin, password);

//                 std::pair<int, std::string> loginResult = userCtrl.toLogin(username, password);
//                 int userId = loginResult.first;
//                 std::string userType = loginResult.second;

//                 if (userId != -1)
//                 { // 登录成功
//                     if (userType == "Seller")
//                     {
//                         currentUser = new Seller(userId, userCtrl); // 假设 Seller 构造函数接受 UserController 引用
//                     }
//                     else if (userType == "Customer")
//                     {
//                         currentUser = new Customer(userId, userCtrl, productCtrl);
//                     }
//                     else
//                     {
//                         std::cerr << "错误：未知的用户类型 '" << userType << "'。\n";
//                         // currentUser 保持 nullptr
//                     }

//                     if (currentUser)
//                     {
//                         // 从UserController获取用户信息并设置到currentUser对象中
//                         currentUser->setId(userId);                               // 假设 User 基类有 setId 方法
//                         currentUser->setUsername(userCtrl.findUsername(userId));  // findUsername 应该公开或有等效方法
//                         currentUser->setBalance(userCtrl.getBalanceById(userId)); // 需要 getBalanceById
//                         // currentUser->setPassword(userCtrl.getPasswordById(userId)); // 通常不直接设置密码到对象，除非特定需要

//                         std::cout << "用户 " << currentUser->getUsername() << " (" << currentUser->getUsertype() << ") 登录成功！\n";
                        
//                     }
//                 }
//                 break;
//             }
//             case 2:
//             { // 用户注册
//                 std::string regUsername, regPassword, confirmPassword, regUserTypeChoiceStr;
//                 std::string regUserType;
//                 int typeChoiceNum;

//                 std::cout << "--- 用户注册 ---\n";
//                 std::cout << "请输入用户名 (3-18位字母或数字): ";
//                 std::getline(std::cin, regUsername);
//                 while(1)
//                 {
//                     if (!userCtrl.isUsernameValid(regUsername))
//                     {
//                         std::cout << "用户名格式错误！请设置用户名为3-18位字母或数字。\n";
//                         std::cout << "请再次输入用户名: ";
//                         std::getline(std::cin, regUsername);
//                         continue;
//                     }
//                     if(userCtrl.isUserNameExist(regUsername))
//                     {
//                         std::cout << "用户名已存在，请选择其他用户名。\n";
//                         std::cout << "请再次输入用户名: ";
//                         std::getline(std::cin, regUsername);
//                     }
//                     else    //名字合法会进入到if-else分支，合法的情况下名字又没被占用就可以退出了
//                         break;
//                 }

//                 std::cout << "请输入密码 (5-12位字母或数字): ";
//                 std::getline(std::cin, regPassword);
//                 while(!userCtrl.isPasswordValid(regPassword))
//                 {
//                     std::cout << "密码格式错误！请设置密码为5-12位字母或数字。\n";
//                     std::cout << "请再次输入密码: ";
//                     std::getline(std::cin, regPassword);
//                 }
                
//                 std::cout << "请再次输入密码以确认: ";
//                 std::getline(std::cin, confirmPassword);
//                 while (regPassword != confirmPassword)
//                 {
//                     std::cout << "两次输入的密码不一致，请重试。\n";
//                     std::cout << "请再次输入确认密码: ";
//                     std::getline(std::cin, confirmPassword);
//                 }
//                 std::cout << "请选择用户类型 (1. 商家, 2. 消费者): ";
//                 while (!(std::cin >> typeChoiceNum) || (typeChoiceNum != 1 && typeChoiceNum != 2))
//                 {
//                     std::cout << "无效选择。请输入 1 (商家) 或 2 (消费者): ";
//                     clearCin();
//                 }
//                 clearCin(); // 清除数字输入后的换行符

//                 if (typeChoiceNum == 1)
//                 {
//                     regUserType = "Seller";
//                 }
//                 else
//                 {
//                     regUserType = "Customer";
//                 }

//                 userCtrl.toRegister(regUsername, regPassword, regUserType);
            
                    

//                 // toRegister 方法会打印成功或失败的消息
//                 break;
//             }
//             case 3:
//             { // 浏览商品 (游客)
//                 std::cout << "--- 游客浏览模式 ---\n";
//                 productCtrl.viewAndSearchProductsMenu(false, 0); // 游客调用此方法
//                 break;
//             }
//             case 0:
//             { // 退出平台
//                 running = false;
//                 std::cout << "感谢使用电商平台，再见！\n";
//                 break;
//             }
//             default:
//                 std::cout << "无效的选项，请重新输入。\n";
//                 break;
//             }
//         }
//     }

//     // 确保如果currentUser在循环结束时仍然存在（例如，如果直接break出循环而没有登出）
//     // 但正常逻辑下，退出循环前 currentUser 应该是 nullptr
//     if (currentUser)
//     {
//         delete currentUser;
//         currentUser = nullptr;
//     }

//     std::cout << "程序已退出。\n";
//     return 0;
// }